﻿#ifndef CPRINT_H
#define CPRINT_H
#include "fileoperation.h"
#include "callingdll.h"
#include "linuxsystemmethod.h"

#include <stdio.h>
#include <QString>
#include <string>
#include <QLibrary>
#include <iostream>
#include<QPaintEvent>
#include <QHBoxLayout>
#include <QtWidgets>
#include <QCoreApplication>
#include <QDesktopServices>
#include <QStylePainter>
#include <QScrollArea>
#include <QObject>
#include <QDebug>
#include <QThread>
#include <QList>
#include <QMutex>
#include <QFile>
#include <QByteArray>

//USB
#include <QtCore>
#include <libudev.h>
//CBC_DES加密
#include <openssl/des.h>
#include <sstream>
//摄像头
#include <QCamera>
#include <QCameraImageCapture>
#include <QMediaRecorder>
#include <QVideoWidget>
#include <QFileDialog>
#include <QPushButton>
#include <QMessageBox>
#include <QCameraInfo>

using namespace std;

//TCP父协议号
#define ACQUISITION_STATION  0                    //采集站
//TCP子协议号
//客户端请求
#define HEARTBEAT_C  0                    //心跳
#define UPLOAD_C  1                    //上传
#define FIRST_UPLOAD_C  2                    //优先上传
#define GET_LOGIN_CONFIG_C  3                    //获取登录配置
#define BACKGROUND_LOGIN_C  4                    //后台登录
#define UPLOAD_LOGIN_C  5                    //上传登录
#define INTERFACE_MAPPING_C  6                    //接口映射
#define INTERFACE_MAPPING_INFO_C  7                    //接口映射消息
#define INTERFACE_MAPPING_EXIT_C  8                    //接口映射退出
#define INTERFACE_MAPPING_SAVE_C  9                    //接口映射保存
#define INTERFACE_SELECTED_PORT_C  10                    //选中串口
#define INTERFACE_UPLOAD_C  11                    //上转
#define INTERFACE_BACKGROUND_LOGIN_C  12                    //后台登录
#define INTERFACE_QUERY_C  13                    //数据查询
#define POLICE_MODE_C  14                    //警情模式
#define POLICE_SITUATION_INQUIRY_C  15                    //警情查询
#define POLICE_SITUATION_UPLOAD_C  16                  //警情上传
#define POLICE_SITUATION_SKIP_C  17                  //接口映射跳过
#define CANCEL_UPLOAD 18 //取消导入
#define LOCK_LABEL_C 19 //锁定图标
#define INTERFACE_SWITCH_C 20 //接口切换
//服务端回复
#define HEARTBEAT_S  0                    //心跳
#define UPLOAD_S  1                    //上传
#define FIRST_UPLOAD_S  2                    //优先上传
#define GET_LOGIN_CONFIG_S  3                    //获取登录配置
#define BACKGROUND_LOGIN_S  4                    //后台登录
#define UPLOAD_LOGIN_S  5                    //上传登录
#define INTERFACE_MAPPING_S  6                    //接口映射
#define INTERFACE_MAPPING_INFO_S  7                    //接口映射消息回复
#define INTERFACE_MAPPING_EXIT_S 8                       //接口映射退出
#define INTERFACE_MAPPING_SAVE_S  9                    //接口映射保存
#define INTERFACE_THREAD_RESTART  99                    //线程重启
#define MESSAGE_SYNCHRONIZATION     10   // 消息同步
#define INTERFACE_BACKGROUND_LOGIN_S  12                    //后台登录
#define INTERFACE_QUERY_S  13                    //数据查询
#define UPDATE_CONTROL_S  100                    //修改控件
#define DEPARTMENT_FILE_QUERY_S  15                    //部门文件查询
#define POLICE_SITUATION_INQUIRY_S  16                    //警情查询
#define POLICE_SITUATION_UPLOAD_S  17                  //警情上传

#define  LOCK_LABEL_S 19 //锁定图标
#define INTERFACE_SWITCH_S 20 //接口切换
//Ui标签控件ID
#define NOTICE_UI  -5                    //公告
#define CPU_UI  -1                    //CPU
#define MEMORY_UI  -2                    //内存
#define DISK_UI  -3                    //磁盘
#define NETWORK_UI       -4    // 网速
#define BACKCONNECTION    -7    // 后台了链接状态
//回复消息状态标识
#define SUCCESS  0                    //成功
#define FAIL  1                    //失败
#define EXIT  2                    //退出
#define SAVE  3                    //保存
#define SUCCESS_ADMIN 4

//线程&其他标识号
#define VIDEO  0                    //视频
#define PHOTO  1                    //照片
#define AUDIO  2                    //音频
#define LOG  3                    //日记
#define THREADC6       1    // TCLC6
#define THREADC7       2    // TM_C7
#define THREADTC7       7    // TM_C7
#define THREADS8       3    // TM_S8
#define THREADT6       4    // TM_T6T5R1R2T7T6P6ac1
#define THREADR1       5      //TCL_
#define THREAD3A       6      //TCL_3A
#define SYSTEMLIST      5
#define SYSTEMROW       5
#define MAXTHREAD     10    // 最大线程数
#define SYSTEMSUM     26    // 数组总大小
#define UNPLUG         96    // 拔出监听
#define DISKSR         97    // u盘监听
#define MONITOR        98    // 监听
#define TLOGON    99    // 登录
#define TUPLOAD   100   // 上传
#define AUTOMATIC_TUPLOAD   110   // 自动上传
#define WARNING_TUPLOAD   111   // 警情上传
#define TUPLOADTWO 101  // 优先上传
#define AUTOMATIC_TUPLOADTWO   110   // 自动上传
#define TNOTICE     102   // 通知
#define SYSTEMINFO     103   // 系统信息
#define INTERFACEMAPPING     104   // 接口映射
#define INTERFACEMAPPING_SAVE     105   // 接口映射保存
#define INTERFACEMAPPING_EXIT     106   // 接口映射退出
#define MESSAGESYNCHRONIZATION     107   // 消息同步
#define BACKGROUNDLOGIN     108   // 后台登录
#define QUERY     109   // 数据查询
#define TUPLOAD_LOGIN  150   // 数据查询
#define EPARTMENT_FILE_QUERY  14                    //部门文件查询
#define POLICE_SITUATION_INQUIRY  15                    //警情查询
#define LOCKLABEL 16//锁定图标
//Ui状态
#define STATELESS  -1                    //无状态
#define UPLOADING  0                    //正在上传
#define INITIALIZING  1                    //正在初始化
#define INITIALIZED  2                    //已初始化
#define TURNINGTHEDIAL  3                    //正在转盘
#define TURNTABLESUCCESSFUL  4                    //转盘成功
#define TURNTABLEFAILED  5                    //转盘失败
#define DISKMODE  6                    //磁盘模式
#define IDLE  7                    //空闲
#define UPLOADCOMPLETED  8         //上传完成
#define UPLOADFAILED  9         //上传失败
#define UNBOUND  10         //未绑定警员编号，请手动绑定
#define WARNBOUND  12         //已绑定警员编号，点击进入警情模式
#define SCHEDULE  11                    //上传进度
#define UPLOADSTOP 13  //上传停止
//设备信息
struct DeviceInforMation
{
    int Indet;  //索引
    int serialportnum;//几号串口
    QString serialport;  //实际路径 磁盘路径
    QString vid;//vid
    QString pid;//pid
    QString Bus;//Bus   USB驱动路径
    QString serialnumber;//设备序列号
    QString manufacturer;//设备制造商 3
    QString model;//设备型号 4
    QString route;//驱动位置路径  和Bus差不多
    QString Device;//盘符路径
    QString Identnumber;//标识号
};
//设备信息
struct UsbInfo
{
    QString Bus ;
    QString vid;//vid
    QString pid;//pid
QString deviceName;
};
struct Announcement
{
    QString AnnouncementTitle;//公告标题
    QString AnnouncementContent;//公告内容
    QString AnnouncementTime;//公告时间
    QString AnnouncementCc;//公告发送人
};
struct C6Info//线程执行完放回
{
    int indentID;
    int SerialportNum;
    QString serialnumber;
    QString Identnumber;
};
struct UploadInfo//线程执行完放回
{
    int Indet;  //索引
    int SerialportNum;//几号串口
    QString UserID;//UserID
    QString Password;//Password
    QString Identnumber;//标识号
    QString Device;//盘符
};


struct ThreadInfo//线程插入
{
    int Indet;  //索引
    int SerialportNum;//几号串口
    QString Serialnumber;//序列号
    QString Device;//盘符
    QString Identnumber;//标识号
};
struct InterfaceMappingInfo//接口映射信息
{
    int Indet;  //索引
    int Row;
    int Column;
    int AppointFirst;
};
struct LoginInfo//登录信息
{
    int Indet;  //索引
    int SerialportNum;//几号串口
    QString UserID;//UserID
    QString Password;//Password
    QString Identnumber;//标识号

};
struct DepartmentInfo//文件/部门信息
{
    QString ID;  //部门编号
    QString  Name;//名称

};
struct WarnInstanInfo//查询警情信息
{
    int Indet;  //索引
    QString StartTime;  //开始时间
    QString EndTime;  //结束时间
    QString ID;  //部门编号
    QString  Name;//名称
    QString  UserID;//警员id

};
struct WarnInfo//警情信息
{
    QString case_number;//警情号
    QString unit_number;//部门号
    QString case_desc;//警情内容
    QString happen_address;//警情地点
    QString call_police_time;//出警时间
    QString alarm_time_text;//处警时间
    QString trafficCaseTable;//警情表
};
struct BindingInfo//绑定信息
{
    int SerialPort;//编号
    double fileSize;
    QString case_number;//警情号
    QString trafficCaseTable;//警情表
    QString file_type_id;//文件类型id
    QString fileName;//文件名字
    QString lastModified;// 修改时间
    QString sourceFilePath;//路径

};
struct Send
{
  int ParentID;
  int SubID;
   QJsonObject jsonObject;
};
struct RetranSmission
{
    QString fileName;
    QString Identnumber;//标识号
    QString UserID;//UserID
};
extern int SerialPort;//当前选中上传口号
extern int NewSerialportNum;//现在选择的是几号重置口
extern int AppointFirstNum;//现在选择的是几号优先串口
extern int row;//行
extern int column;//列
extern int UploadNum;//上传数量
extern bool IsWarnInstance;//是否是警情模式
extern bool IsC7Task;//任务是否完成；
extern bool IsUploadTask;//任务是否完成；
extern bool IsUploadTwoTask;//任务是否完成；
extern bool IsUDrive;//是否是盘符
//是否转盘完成
extern bool IsC6;//
extern bool IsT6;//
extern bool IsR1;//
extern bool Is3A;//
extern bool IsC7;//
extern bool IsUpload;//
extern bool IsPUpload;//

extern bool IsTerface;//接口映射
extern bool IsSwitch;//接口映射
extern bool IsALL;//是否存在未识别路径 true为否，false为是
extern bool IsDeleteFiles;//上传是否删除文件
//extern QString Name;
//extern QString Version;
//extern QString Model;
//extern QString Date;
//extern QString Icon;
//extern QString PrintLog;
//extern QString Area;//地区
//extern QString BVersion;//后台版本号
//extern QString URL;//后台地址
//extern QString Ttime;//后台心跳时间
//extern QString NetworkName;//网络名称
//extern QString ServerAddress;//服务端IP
//extern QString ServerPor;//服务端端口
extern QString cloudIp;//采集站IP
extern QString station_number;//采集站编号
extern QString access_key ;//采集站秘钥
//extern QString UploadUrl ;//上传路径
//extern QString MountUrl ;//挂载根目录
//extern QString DeleteFiles;//上传是否删除文件
//extern QString MUI;//语言包
//extern  QString PortNum;//端口数量
//extern QString MemoryLack;//内存不足报警
//extern QString CPULack;//CPU不足报警
//extern QString Camera;//是否启动摄像头
//extern QString TheLocalKey;//账号
//extern QString TheLocalKeyPDW;//密码
//extern QString Sockettime;//服务链接间隔时间
//extern QString Mode;//上传模式
//extern QString FingerPrint;//是否启动指纹识别
//extern QString FaceRecognition;//是否启动人脸识别
//extern QString MaxUploadRate;//最大上传速率
//extern  QString prior;//优先口
//extern  QString System;//系统
extern QString FingerprintData;//指纹数据
extern QString IP;//IP地址
extern qint64 Lasttimes ;//上一次重传时间
extern qint64 Noticetimes ;//上一次重传时间
extern int NoticeFailNum ;//后台失败次数

extern QString downloadSpeed;//下载
extern  QString uploadSpeed;//上传
extern    double TotalGB ;
extern    double FreeGB ;
//extern int  UploadRate;//最大上传速率
//锁
extern QMutex myVecMutex;//
extern QMutex DeviceserialMutex;
extern QMutex DriveLetterMutex;

extern double fileallsize[SYSTEMSUM];//串口上传的所有文件大小

extern int  IsBackdll[SYSTEMSUM];//dll调用是否成功 0进入转盘 1转盘成功 -1转盘失败 2磁盘模式 3正在传盘
extern bool IsPriorlize[SYSTEMSUM];//是否为优先口 true为优先口，false反正
extern bool IsInitalize[SYSTEMSUM];//是否进入初始化 true为已经初始化成功，false反正
extern bool IsALLlist[SYSTEMSUM];//是否重置路径 true为已经重置成功，false反正
extern bool IsExtract[SYSTEMSUM];//是否拔出 true为已经重置成功，false反正
extern bool IsinUpload[SYSTEMSUM];//是否上传 true为已经重置成功，false反正
extern double   totalSize[SYSTEMSUM];//设备数据大小
extern double   TemporarytotalSize[SYSTEMSUM];//设备数据大小
extern qint64 UploadSchedule[SYSTEMSUM];
extern qint64 LastTemporarytotalSize[SYSTEMSUM];//上一次设备数据大小
extern int IdentElectricity[SYSTEMSUM];
extern QString cSerial[SYSTEMSUM];         //执法记录仪产品序号
extern QString userNo[SYSTEMSUM];      //执法记录仪警员编号
extern QString userName[SYSTEMSUM]; //执法记录仪警员名称
extern QString unitNo[SYSTEMSUM];       //执法记录仪单位编号
extern QString unitName[SYSTEMSUM];  //执法记录仪单位名称
extern QString status[SYSTEMSUM];   //执法仪禁用状态
extern QString bindStatus[SYSTEMSUM];//执法仪配对状态；
extern QString watermark[SYSTEMSUM];//水印；
extern QString resolution[SYSTEMSUM];//分辨率；

extern QString IdentModel[SYSTEMSUM];//记录设备型号
extern QString IdentNumber[SYSTEMSUM];//记录设备标识号
extern QString IsUdisk[SYSTEMSUM];//转盘是否成功 有值则有，没有则无
extern QString Uploadtime[SYSTEMSUM];//开始上传时间
extern std::vector<Announcement> Notice;
extern std::multimap<int,QString> TemporaryPath;//临时路径
extern std::multimap<int,QString> AnalysisPath;//解析路径
extern std::vector<DeviceInforMation> myVec;//接入的设备信息
extern std::vector<DepartmentInfo>Filetype ;//文件类型
extern std::vector<DepartmentInfo>DepartmentName ;//部门名称
extern std::vector<WarnInfo>PoliceInfo ;//警情名称
extern std::list<BindingInfo>BindList;//绑定信息
extern  std::list<Send> Send_List;                             // 任务队列
extern std::vector<UsbInfo> usbInfo;//接入的设备信息
extern std::list<RetranSmission>ARQList;//重传
extern UploadInfo Upload;
extern UploadInfo UploadTwo;
extern FileOperation config;
extern DeviceInforMation deviceinfo;
extern CallingDLL dll;
extern LinuxSystemMethod sys;

//初始化
inline void DeviceInfo();
//获取序列号
void GetSerialNumber(int serialportnum,QString Device,QString serialnumber);
//采集站初始化
void InterfaceMapInfo();
//监听U盘
void ListeningDisks(DeviceInforMation UsbInfo);
//监听拔出
void ListeningUnplug(QString Path);
//监听识别
void ListeningAccess(DeviceInforMation UsbInfo);
//查询Mver内存
int GetMyVec(QString Route,QString Serialnumber);
//配对机器型号
bool GetDeviceName(QString vid ,QString pid);
//接口映射下一个
void NextInit();
//加解密
bool encryptFile(const QString& filePath, const QString& password);
bool decryptFile(const QString& filePath, const QString& password);
    void getUsbInfo();
QString generateRandomString();


QString GetDeviceIDByDeviceID(QString deviceID);
class GlobalSignals : public QObject
{
    Q_OBJECT
public:
    static GlobalSignals& instance()
    {
        static GlobalSignals s;
        return s;
    }
private:
    GlobalSignals();
    GlobalSignals(const GlobalSignals&) = delete;
    GlobalSignals& operator=(const GlobalSignals&) = delete;
signals:
    void SendMessageNotifica(int ParentID, int SubID, int state);
    void SendUiMessageNotifica(int ParentID, int SubID, int SerialportNum, QString Text, QString TextInfo, int Textprompt, int Display);
    void SendIMMessageNotifica(int ParentID, int SubID, InterfaceMappingInfo Info);
    void SendDIMMessageNotifica(int ParentID, int SubID, DeviceInforMation Info);
    void SendPoliceMode(int ParentID, int SubID);
    void ThreadJoin(int serialportnum,QString vid ,QString pid,QString serialnumber);
    void ThreadUpload(int serialportnum,QString userID,QString pwd);
    void ThreadPriorUpload(int serialportnum,QString userID,QString pwd);
    void ThreadBandingUpload(int serialportnum);
    void ThreadTimer(int serialportnum,bool IsStart);
};


#endif // CPRINT_H
